/**
 * symbol 就是不能被改变的值
 */

let ck = Symbol('ck')
let kb = Symbol('kb')
console.log(ck);
console.log(kb);
console.log(ck === kb) // false

let ck2  = Symbol('ck2')
let ck3 = Symbol('ck2')
console.log(ck2 === ck3) // false

let ck1 = Symbol.for('ck1');
let kb1 = Symbol.for('kb1');
console.log(Symbol.keyFor(ck1));
console.log(Symbol.keyFor(kb1));

const symbol = Symbol('this is the Symbol');
const User = {
  name:'ck',
  [symbol]: 'ck is not a student any more'
}
// for of 必须是在可遍历iterotar中实现的.
// for in 循环对象, 输出的是key

// 只能遍历到普通属性
for(let item in User) {
  console.log('in',item);
}

// 只能遍历到普通属性
for(let item of Object.keys(User)){
  console.log(item);
}

// 遍历Symbol属性
for(let item of Object.getOwnPropertySymbols(User)){
  console.log(item);
}

// 遍历到普通属性、Symbol属性
for(const item of Reflect.ownKeys(User)){
  console.log(item);
}

let site = Symbol('this is site Symbol')

class UserV1 {
  constructor(name, value) {
    this.name = name
    //  这里的site其实是一个Promise, 使用Promise其实是一个独一无二的, 相当于kobe, 这里获取的就是kobe
    this[site] = value
  }
  getName() {
    return `${this[site]} ${this.name}`
  }
}

const userv1 = new UserV1('bob', 'ck.com')

// 这里只能获取到name一个属性, 其他属性是会被隐藏的.
for(let item in userv1){
  console.log(item);
}
console.log(userv1.getName());


// 7 8 9 10 11 12 13 14 15 16

// Symbol Symbol.for() Symbol.keyFor()
